# -*- coding:utf-8 -*-
__author__ = 'Dragon Sun'
__date__ = '2025-07-01 12:39:31'

import threading
from pathlib import Path
from typing import Optional

from dsConfigCenter import config_center
from dsPyLib.ali.ali_tts import tts_to_file
from dsPyLib.sound.sound import play_wav_async
from dsPyLib.基类.枚举基类 import 枚举基类


# 值为优先级，值越大，优先级越高
class 行情提示音枚举(枚举基类):
    异常 = 0
    已获取 = 1
    顺向 = 2
    逆向 = 3
    放量 = 4
    大K线 = 5
    锤头线 = 6
    跨均线 = 7
    分型 = 8
    RSI超买超卖 = 9
    MACD金叉 = 10
    MACD死叉 = 11
    MACD顶背离 = 12
    MACD底背离 = 13
    破上轨 = 14
    破下轨 = 15


行情提示音映射 = [
    {行情提示音枚举.异常.name: 'K线异常'},
    {行情提示音枚举.已获取.name: '已获取'},
    {行情提示音枚举.顺向.name: '顺向'},
    {行情提示音枚举.逆向.name: '逆向'},
    {行情提示音枚举.放量.name: '放量'},
    {行情提示音枚举.大K线.name: '大K线'},
    {行情提示音枚举.锤头线.name: '锤头线'},
    {行情提示音枚举.跨均线.name: '跨均线'},
    {行情提示音枚举.分型.name: '分型'},
    {行情提示音枚举.RSI超买超卖.name: '超买超卖'},
    {行情提示音枚举.MACD金叉.name: '金叉'},
    {行情提示音枚举.MACD死叉.name: '死叉'},
    {行情提示音枚举.MACD顶背离.name: '顶背离'},
    {行情提示音枚举.MACD底背离.name: '底背离'},
    {行情提示音枚举.破上轨.name: '破上轨'},
    {行情提示音枚举.破下轨.name: '破下轨'},
]


def 录制文本到文件(text: str, filename: str):
    ali_config = config_center.get_ali()
    文件名 = Path(__file__).parent / 'media' / filename
    文件名 = str(文件名.resolve())
    tts_to_file(
        text_data=text,
        filename=文件名,
        access_key_id=ali_config.access_key_id,
        access_key_secret=ali_config.access_key_secret,
        app_key=ali_config.tts_app_key
    )


def 行情提示音文件名(提示音: 行情提示音枚举) -> str:  # 例如：'00_K线_异常.wav'
    return f'{提示音.value:02d}_K线_{提示音.name}.wav'


def 录制操作提示音文件():
    录制文本到文件('成功', '操作_成功.wav')
    录制文本到文件('失败', '操作_失败.wav')


def 录制行情提示音文件():
    for 映射项 in 行情提示音映射:
        for 枚举名 in 映射项.keys():
            枚举项 = 行情提示音枚举[枚举名]
            提示音内容 = 映射项[枚举名]
            提示音文件名 = 行情提示音文件名(提示音=枚举项)
            录制文本到文件(text=提示音内容, filename=提示音文件名)


def 播放操作提示音(成功: bool) -> threading.Thread:
    仅文件名 = '操作_成功.wav' if 成功 else '操作_失败.wav'
    文件全名 = str(Path(__file__).parent / 'media' / 仅文件名)
    return play_wav_async(文件全名)


def 播放行情提示音(提示音: 行情提示音枚举) -> threading.Thread:
    仅文件名 = 行情提示音文件名(提示音=提示音)
    文件全名 = str(Path(__file__).parent / 'media' / 仅文件名)
    return play_wav_async(文件全名)


# 仅播放优先级最高的一个
def 播放行情列表提示音(提示音列表: list[行情提示音枚举]) -> Optional[threading.Thread]:
    值列表 = [x.value for x in 提示音列表]
    降序列表 = sorted(值列表, reverse=True)
    if len(降序列表):
        值 = 降序列表[0]
        行情 = 行情提示音枚举(值)
        return 播放行情提示音(提示音=行情)
    else:
        return None


if __name__ == '__main__':
    录制操作提示音文件()
    录制行情提示音文件()
